package com.aliyun.dts.deliver.commons.util;


import com.google.common.collect.AbstractIterator;

import java.util.*;
import java.util.function.Supplier;

public class MoreIterators {

    /**
     * Create an iterator from elements
     *
     * @param elements element to put in iterator
     * @param <T> type
     * @return iterator with all elements
     */
    public static <T> Iterator<T> of(final T... elements) {
        return Arrays.asList(elements).iterator();
    }

    /**
     * Create a list from an iterator
     *
     * @param iterator iterator to convert
     * @param <T> type
     * @return list
     */
    public static <T> List<T> toList(final Iterator<T> iterator) {
        final List<T> list = new ArrayList<>();
        while (iterator.hasNext()) {
            list.add(iterator.next());
        }
        return list;
    }

    /**
     * Create a set from an iterator
     *
     * @param iterator iterator to convert
     * @param <T> type
     * @return set
     */
    public static <T> Set<T> toSet(final Iterator<T> iterator) {
        final Set<T> set = new HashSet<>();
        while (iterator.hasNext()) {
            set.add(iterator.next());
        }
        return set;
    }

    public static <T> Iterator<T> singletonIteratorFromSupplier(final Supplier<T> supplier) {
        return new AbstractIterator<T>() {

            private boolean hasSupplied = false;

            @Override
            protected T computeNext() {
                if (!hasSupplied) {
                    hasSupplied = true;
                    return supplier.get();
                } else {
                    return endOfData();
                }
            }

        };
    }

}